#pragma once

#include <QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QAudioFormat>
#include <QAudioDevice>
#include <QMediaDevices>
#include <QAudioSource>
#include <QtCharts/QValueAxis>
#include <QSysInfo>  // 添加此头文件
#include <QTimer>     // 用于计时
#include <QDateTime>  // 用于获取当前时间
#include <QElapsedTimer>  // 用于精确计时
#include "QmyDisplayDevice.h"
#include <memory>
#include <QByteArray>  // 用于存储音频数据

namespace Ui {
class MainWindow;
}

class QmyDisplayDevice;  // 前向声明

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    // 图表类型枚举
    enum ChartType {
        LineChart,
        RectChart
    };

    static constexpr qint64 displayPointsCount = 4000;
    Ui::MainWindow *ui;

    QChart *lineChart;        // 线性图表
    QChart *rectChart;        // 矩形图表
    QChartView *rectChartView; // 矩形图视图
    QLineSeries *lineSeries;
    QBarSeries *barSeries;  // 条形图系列
    QBarSet *barSet;        // 条形图数据集
    QValueAxis *lineAxisX;   // 线性图X轴
    QValueAxis *lineAxisY;   // 线性图Y轴
    QValueAxis *rectAxisX;   // 矩形图X轴
    QValueAxis *rectAxisY;   // 矩形图Y轴
    ChartType currentChartType;  // 当前图表类型
    QList<QAudioDevice> deviceList;
    QAudioDevice curDevice;
    std::unique_ptr<QAudioSource> audioInput;
    // 修改后
    std::unique_ptr<QmyDisplayDevice> displayDevice;  // 使用具体类型
    QAudioFormat format;
    bool isRunning = false; // 标记音频是否正在运行
    QByteArray audioBuffer;  // 用于存储录音数据
    QTimer *recordingTimer;  // 用于更新录音时间显示
    QElapsedTimer elapsedTimer; // 用于精确测量录音时长
    QDateTime startTime; // 录音开始时间

    // 辅助函数
    QString sampleFormatToString(QAudioFormat::SampleFormat format);
    QString byteOrderToString(QSysInfo::Endian endian);  // 修改为 QSysInfo::Endian
    // 更新音频设备配置的辅助函数
    void updateAudioConfig();

private slots:
    void updateBlockSizeDisplay(qint64 blockSize);
    void on_comboDevices_currentIndexChanged(int index);
    void on_actStart_triggered();
    void on_actStop_triggered();
    void on_actDeviceTest_triggered();
    void updateAudioDisplay(qint64 blockSize);  // 新增槽函数
    // 实时参数更新槽函数
    void on_comboSampleRate_currentIndexChanged(int);
    void on_comboChannels_currentIndexChanged(int);
    void on_comboSampleTypes_currentIndexChanged(int);
    void on_radioPCM_toggled(bool checked);
    void on_radioATUIM_toggled(bool checked);
    // 文件操作相关槽函数
    void on_actSaveFile_triggered();
    // 计时器更新槽函数
    void updateRecordingTime();
    // 图表类型切换槽函数
    void on_radioLineChart_toggled(bool checked);
    void on_radioRectChart_toggled(bool checked);
    
    // 切换图表类型的辅助函数
    void switchChartType(ChartType type);
};
